#ifndef __STDTCPSERVER_H__
#define __STDTCPSERVER_H__

#include <iostream>
#include <memory>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <cstring>
#include <arpa/inet.h>
#include <json-c/json.h>

/* 配置类 */
class StdTcpSocketPrivate
{
public:
    StdTcpSocketPrivate();
    ~StdTcpSocketPrivate();

public:
    sockaddr_in serverAddress;
};

/* 通信类 */
class StdTcpSocket
{
public:
    /* 构造函数 */
    StdTcpSocket();

    /* 析构函数 */
    ~StdTcpSocket();

public:
    /* 连接服务器 */
    int connectToServer(const char *ip, int port);
    /* 是否连接成功 */
    bool isConnected() const;
    /* 发送信息 */
    int sendMessage(const std::string &sendMsg);
    /* 发送信息 */
    int sendMessage(const void *sendMessage, size_t n);
    /* 接收信息 */
    int recvMessage(std::string &recvMessage);
    /* 接收信息 */
    int recvMessage(void *buf, size_t n);
    /* 设置属性 */
    StdTcpSocketPrivate *getSockAttr() const;

private:
    /* 智能指针 */
    std::unique_ptr<StdTcpSocketPrivate> m_sockAttr;
public:
    int m_sockfd;
    bool m_connected;
};

/* 服务器 */
class StdTcpServer
{
public:
    /*构造函数*/
    StdTcpServer();
    /* 析构函数 */
    ~StdTcpServer();

public:
    /*设置监听 */
    bool setListen(int port);
    /*接收连接 */
    std::shared_ptr<StdTcpSocket> getclientsock();

private:
    /*端口 */
    int m_port;
    /*服务器的属性 */
    std::unique_ptr<StdTcpSocketPrivate> m_tcpAttr;
    int m_listenfd;
};

#endif /
